#ifndef ODB_MYSQL_MESSAGE_H
#define ODB_MYSQL_MESSAGE_H

#include <memory>
#include <odb/database.hxx>
#include <odb/mysql/database.hxx>
#include <string>
#include <vector>

#include "database_factory.h"
#include "message.hxx"

namespace chat {
class MessageTable {
   public:
    MessageTable(const std::shared_ptr<odb::mysql::database>& db) : db_(db) {}

    bool insert(Message& message);
    bool remove(const std::string& chat_session_id);

    /**
     * @brief 获取最近的count条消息
     * 
     * @param chat_session_id[in]: 消息所属的会话
     * @param count[in]: 获取的消息数量
     */
    std::vector<Message> recent(const std::string& chat_session_id,
                                size_t count);

    /**
     * @brief 获取指定时间范围内的消息
     * 
     * @param chat_session_id[in]: 消息所属的会话
     * @param begin[in]: 时间范围的开始时间
     * @param end[in]: 时间范围的结束时间
     */
    std::vector<Message> range(const std::string& chat_session_id,
                               const boost::posix_time::ptime begin,
                               const boost::posix_time::ptime end);

   private:
    std::shared_ptr<odb::mysql::database> db_ = nullptr;
};

using MessageTablePtr = std::shared_ptr<MessageTable>;
}  // namespace chat

#endif  // ODB_MYSQL_MESSAGE_H
